package jp.co.nes.awssupport.report;

import java.math.BigDecimal;
import java.util.List;

import org.kohsuke.args4j.Option;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jp.co.nes.awssupport.access.dao.AmountReportDao;
import jp.co.nes.awssupport.common.bean.AmountReportBean;
import jp.co.nes.awssupport.report.utility.ReportHelper;

/**
 * リソースID別料金レポートを出力するクラスです。<br>
 * 作成したリソースID別料金レポート(CSV)をs3にアップし、署名付きURLを作成します。<br>
 * また、作成した署名付きURLを、サポートポータルの利用実績へ反映します。
 */
public class AmountPerResourceIdReportClient extends AbstractAmountReportClient {

    /** ロガー */
    private static Logger logger = LoggerFactory.getLogger(AmountPerResourceIdReportClient.class);

    /** 処理対象年月差月数(必須コマンドライン引数) */
    @Option(name = "-diffMonth", usage = "処理対象年月差月数(必須)", metaVar = "diffMonth", required = true)
    private String paramDiffMonth;

    /**
     * メインメソッドです。
     *
     * @param args コマンドライン引数
     */
    public static void main(String[] args) {
        AmountPerResourceIdReportClient client = new AmountPerResourceIdReportClient();
        client.execute(args);
    }

    /**
     * デフォルトコンストラクタです。
     */
    public AmountPerResourceIdReportClient() {
    }

    /**
     * レポートヘルパーを引数に持つコンストラクタです。
     *
     * @param reportHelper レポートヘルパー
     */
    public AmountPerResourceIdReportClient(ReportHelper reportHelper) {
        super(reportHelper);
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.report.creating.AbstractReportClient#getProcessName()
     */
    @Override
    protected String getProcessName() {
        return "リソースID別料金レポート出力処理";
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.report.creating.AbstractReportClient#getDiffMonth()
     */
    @Override
    protected long getDiffMonth() {
        return Long.parseLong(paramDiffMonth);
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.report.creating.AbstractReportClient#getMethodNameForURL(java.lang.String)
     */
    @Override
    protected String getMethodNameForURL(String objectKey) {
        return "setAmountPerResourceIdReportCSV";
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.report.AbstractAmountReportClient#searchReportDetail(java.lang.String)
     */
    @Override
    protected List<AmountReportBean> searchReportDetail(String targetId) {
        AmountReportDao dao = new AmountReportDao();
        return dao.getReportDataPerResourceId(targetId, getTargetYearMonth());
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.report.creating.AbstractAmountReportClient#createReportHeader()
     */
    @Override
    protected String createReportHeader() {
        return "ResourceId,ProductName,Amount" + LINEFEED;
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.report.AbstractAmountReportClient#createReportLine(jp.co.nes.awssupport.common.bean.AmountReportBean)
     */
    @Override
    protected String createReportLine(AmountReportBean bean) {
        StringBuilder builder = new StringBuilder();
        if (bean.getResourceId() == null) {
            builder.append(DQ).append(DQ).append(CONNMA);
        } else {
            builder.append(DQ).append(bean.getResourceId()).append(DQ).append(CONNMA);
        }
        builder.append(DQ).append(bean.getProductName()).append(DQ).append(CONNMA);
        builder.append(bean.getAmount().setScale(3, BigDecimal.ROUND_HALF_UP).toString());
        builder.append(LINEFEED);
        return builder.toString();
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractClient#debugArgument()
     */
    @Override
    protected void debugArgument() {
        logger.debug("diffMonth=" + paramDiffMonth);
    }
}
